/**
 * WebSocket 通信消息
 */
class WSMsg { 
  /**
   * WSMsg 构造函数
   * @param state 状态码 默认值 1
   * @param content 内容
   */
  constructor(state,content) {
    this.state = (state != null) ? state : 1;
    this.content = content;
    this.timespan = new Date().getTime();
  }

  /**
   * 设置消息对象的 状态码 和 内容
   * @param state 状态码
   * @param content 内容
   */
  SetStateAndContent(state, content) { 
    this.state = state;
    if (content) { 
      this.content = content;
    }
  }

  toJson() { 
    return JSON.stringify(this);
  }

  /**
   * 将WSMsg的json字符串转成对象
   * @param wsMsgJsonStr WSMsg的Json字符串
   * @returns WSMsg对象
   */
  static json2WSMsgObj(wsMsgJsonStr) {
    var jsonObj = null;
    if (this.isWSMsg(wsMsgJsonStr)) {
      jsonObj = JSON.parse(wsMsgJsonStr);
    }
    return new WSMsg(jsonObj.state, jsonObj.content);
  }

  /**
   * 判断 字符串 是否为 WSMsg 的Json字符串，是否可以转成 WSMsg对象
   * @param {*} msgStr 
   */
  static isWSMsg(msgStr) {
    var jsonObj = null;
    if (typeof msgStr == 'string') {
      try {
        jsonObj = JSON.parse(msgStr);
      } catch (error) {
        jsonObj = null;
      }
    }
    if (jsonObj && jsonObj.hasOwnProperty && jsonObj.hasOwnProperty('state') && jsonObj.hasOwnProperty('content') && jsonObj.hasOwnProperty('timespan')) {
      return true;
    }
    return false;
  }
}

/**
 * WebSocket 服务端客户端 之间 通信消息 类型
 */
WSMsg.StateType = {
  Connect: -1, // 客户端建立MC2S连接请求
  RequestOnlineNodeList: 0,// 请求 在网节点列表
  ResponseOnlineNodeList: 1,// 响应 在网节点列表
  SynchronousBlockData: 2,// 请求 最新区块链数据
  BroadNewBlockData: 3,// 广播 最新一个区块
  Fail: 4
};

module.exports = WSMsg;